Для чего нужна гостевая книга?
Создание и подготовка базы данных
Интеграция системы в уже готовый сайт
Главная страничка гостевой книги (файл Guest.asp)
Примеры, рассмотренные нами в предыдущих частях настоящей статьи, по своей сути в той или иной степени представляли разнообразные интерфейсы к базам данных, а в 14-й части (в №10’2001) мы показали вам один из механизмов привлечения внимания пользователей к сайту. В настоящей статье мы изложим материал, которого будет достаточно для самостоятельной разработки еще одной системы, позволяющей увеличить интерес к вашему сайту и оснастить последний функционалом для обеспечения обратной связи с пользователями. Мы также рассмотрим вопрос об организации переносимого модуля, который может обеспечить легкое и удобное встраивание такой системы практически в любой сайт независимо от его сложности.
Разумеется, здесь речь идет о наиболее типичной гостевой книге. Прежде всего это система, предоставляющая пользователю возможности для ввода текста, выбора оценки того или иного сайта, а также для указания собственных данных (ФИО, e-mail, http и т.д.). Это также система представления данных, введенных различными пользователями, с возможностью навигации, отправки электронных писем авторам сообщений. Возможны и вариации с различными настройками и с контролем нормативности лексики.
Гостевая книга — основной механизм, обеспечивающий обратную связь с пользователями сайта, особенно в том случае, если пользователь желает сделать свое мнение достоянием общественности. Нередки случаи, когда гостевые книги на сайтах превращались в места для дискусий (в форумы, чаты). Таким образом, гостевая книга также (как и система электронного голосования) может пробудить интерес к вашему сайту, а следовательно является еще одним средством привлечения внимания пользователей.
Конечно, предполагается, что читатель знаком с основами ASP- и SQL-программирования (знакомства с первыми частями настоящей статьи для этого будет вполне достаточно). Кроме того, нам потребуется Microsoft SQL Server 7.0 или 2000, какой-нибудь HTML- или текстовый редактор (рекомендую использовать Macromedia Dreamweaver UltraDev 4.0) и немного терпения.
Для организации хранения введенных пользователями данных вам понадобиться одна таблица, где можно завести поля для хранения имени пользователя, его электронного адреса, страны проживания, адреса сайта, IP-адреса, значения оценки пользователем сайта по пятибалльной шкале и т.д:
Представим себе пример реализации такой таблицы: .
В целях удобного встраивания системы в уже существующие сайты рекомендуется спланировать еще одну таблицу, предназначенную для хранения цветовых и других установок. Это позволит в дальнейшем изменять указанные установки без изменений соответствующих параметров в исходных текстах модулей приложения гостевой книги.
Далее необходимо прописать вашу базу данных в соответствующем разделе источников данных системы. Для этого сделайте следующее.
Теперь, когда база данных готова, можно переходить непосредственно к созданию гостевой книги.
Понятно, что сама по себе гостевая книга не имеет смысла. Посудите сами: кому нужен сайт, предназначенный исключительно для сбора мнений читателей. Ведь для того чтобы собирать мнения о чем-либо, надо сначала это что-либо представить на их суд. Следовательно, необходимо уделить особое внимание моментам, связанным с упрощением встраивания системы в уже готовые сайты.
В частности, для упрощения настройки системы под характерные особенности того или иного сайта рекомендуется (как уже говорилось выше) создать специальную таблицу для хранения всех этих предпочтений, чтобы заносить в нее определенные значения, специфические для вашего сайта. Очевидное преимущество такого подхода заключается в том, что для осуществления встраивания системы в уже готовый сайт не потребуется производить изменения в исходном коде модулей, нужно изменить только настройки в соответствующей таблице базы данных.
Представим себе пример реализации такой таблицы: .
Как видите, здесь присутствуют поля для хранения информации об имени и пароле доступа к режиму настройки системы, о цветах основного фона сообщения пользователей, верхней и нижней рамок (поля Mid_Color, Top_Color, Bot_Color соответственно), о цвете и размере заголовка формы, служащей для ввода пользователем данных (поля Form_Color и FormTitleSize соответственно), о цвете, размере и начертании шрифра текста самого сообщения, информационных полей, а также самих страниц с гостевой книгой (поля MessageFontColor, MessageFontSize, MessageFontFace, InfoFontColor, InfoFontSize, InfoFontFace, PageFontColor, PageFontSize и PageFontFace соответственно), полей-переключателей для включения режима автоматической отправки уведомлений о поступлении новых сообщений по электронной почте ответственному лицу (например, менеджеру или администратору сайта), поля хранения электронного адреса ответственного лица, текста сообщения с благодарностями за оставленное пользователем сообщение, со списком недопустимых слов и переключателем режима их фильтрации (если последний включен, то слова, находящиеся в списке недопустимых, будут автоматически заменяться в тексте сообщения на звездочки и таким образом будет осуществлен контроль за нормативностью лексики текстов сайта).
Развитие системы интеграции гостевой книги подразумевает организацию и Web-интерфейса для настройки всех рассмотренных нами параметров (полей таблицы администрирования).
Интеграция системы в уже готовый сайт в чистом виде может создавать некоторые сложности и при восприятии исходного текста, и в дальнейшем, если, например, потребуется временно отключить гостевую книгу на том или ином сайте. Поэтому попытаемся разработать систему таким образом, чтобы ее интеграция в готовый сайт не составила особого труда. Для этого необходимо сформировать независимый модуль системы и включить его в текст основного сайта там, где это необходимо. Так, к примеру, текст страницы вашего сайта может выглядеть следующим образом:
<head> <title>ASP на блюдечке (Часть - 15) – Гостевая книга </title> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> </head> <body marginwidth="0" marginheight="0" leftmargin="0" topmargin="0" > … <!-- #include file="Guest.asp"--> … </body> </html>
или
<!-- #include file="mainheader.inc"--> <!-- #include file="Guest.asp"--> <!-- #include file="mainfooter.inc"-->
Как видите, в первом случае директива о включении странички с гостевой книгой (<!-- #include file="Guest.asp"-->) указана в нужном месте, а во втором случае страничка исходного сайта представлена просто в виде трех последовательно включаемых элементов: начала, странички с гостевой книгой и конца. Использование того или иного способа организации структуры странички вашего сайта — дело вкуса и зависит как от структуры исходного сайта, так и от степени его сложности.
В представленном приложении будет всего одна страничка, которая будет служить и для отображения сообщений пользователей, и для навигации и ввода новых сообщений. В зависимости от значений ключевых параметров будет осуществляться то или иное действие, а страничка будет находиться в том или ином состоянии. Прежде всего вам потребуется разработать ту ее часть, на которой будет происходить показ сообщений пользователей и в которой будут размещены ссылки на часть, служащую для добавления новых сообщений.
Для начала напишем несколько функций для работы со строками:
<!--#include file="config.asp"-->
<% Function ChkString(string) If string = "" then string = " " ChkString = Replace(string, "'", "''") End Function %>
<% Function ChkBadWords(String2) strBadWords = objRec2("BadWords") bwords = split(strBadWords, "|") For i = 0 to ubound(bwords) String2 = Replace(String2, bwords(i), string(len(bwords(i)),"*"), 1,-1,1) Next ChkBadWords = String2 end function %>
<% Function FormatStr(String) on Error resume next String = Server.HTMLEncode(String) String2 = Replace(String, CHR(13), "") String2 = Replace(String, CHR(10) & CHR(10), "</P><P>") String2 = Replace(String, CHR(10), "<br>") If objRec2("BadOn") = True then String2 = ChkBadWords(String2) End if FormatStr = String2 End Function %>
<% Function ValidateField(sFieldValue, sFieldType) Valid = True Select Case LCase(sFieldType) Case "name" If Len(sFieldValue) = 0 Then Valid = False Case "message" If Len(sFieldValue) = 0 Then Valid = False End Select ValidateField = Valid End Function %>
<% Sub Update strSql = "insert into Messages (Name, Country, Email, URL,IP,Message,Rating) values ('" strSql = StrSql & ChkString(Request.Form("name")) & "', '" strSql = StrSql & ChkString(Request.Form("Country")) & "', '" strSql = StrSql & ChkString(Request.Form("email")) & "', '" strSql = StrSql & ChkString(Request.Form("URL")) & "', '" strSql = StrSql & Request.ServerVariables("REMOTE_ADDR") & "', '" strSql = StrSql & ChkString(Request.Form("Message")) & "', '" strSql = StrSql & ChkString(Request.Form("Rating")) & "')" objConn.Execute (StrSql) %>
После этого извлекаются и применяются параметры цветов, размеров, шрифтов оформления из соответствующей таблицы:
<font face="<%=objRec2("PageFontFace")%>" color="<%=objRec2("PageFontColor")%>" size="<%=objRec2("FormTitleSize")%>"><b>Спасибо за вашу запись в нашей гостевой книге!</b><p> <font face="<%=objRec2("PageFontFace")%>" color="<%=objRec2("PageFontColor")%>" size="<%=objRec2("PageFontSize")%>">Для просмотра вашей записи кликните<a href="guest.asp"> здесь</a></b>
А теперь отправьте электронное письмо менеджеру или администратору с уведомлением о поступлении нового сообщения в гостевую книгу в случае необходимости:
<% If Not(Request.Form("email"))="" AND objRec2("AutoEmail")=True then Name = Request.Form("name") Email = Request.Form("email") sFrom = objRec2("YourEmail") sTo=Email sSubject = "Спасибо, Ваша запись в нашей гостевой книге принята!" sMessage = "Дорогой(ая) " & Name & vbcrlf _ & vbcrlf _ & objRec2("ThankMessage") & vbcrlf _ & vbcrlf _ & vbcrlf Set objNewMail = CreateObject("CDONTS.NewMail") objNewMail.Send sFrom, sTo, sSubject, sMessage Set objNewMail = Nothing End If If objRec2("YouEmail")=True then Name = Request.Form("name") Home_Page = Request.Form("url") Email = Request.Form("email") Message = Request.Form("message") Country = Request.Form("Country") Address = Request.ServerVariables("REMOTE_ADDR") Rating = Request.Form("Rating") If Rating ="0" then Rating="No Rating" End If sFrom = objRec2("YourEmail") sTo= objRec2("YourEmail") sSubject = "Новое сообщение" sMessage = "Привет," & vbcrlf _ & "Новое сообщение поступило в гостевую книгу" & vbcrlf _ & vbcrlf _ & ":" & vbcrlf _ & vbcrlf _ & Message & vbcrlf _ & vbcrlf _ & "Детали сообщения:" & vbcrlf _ & "Ваше имя: " & Name & vbcrlf _ & "Email: " & Email & vbcrlf _ & "URL: " & Home_Page & vbcrlf _ & "Страна: " & Country & vbcrlf _ & "Рейтинг: " & Rating & vbcrlf _ & "Адрес: " & Address Set objNewMail = CreateObject("CDONTS.NewMail") objNewMail.Send sFrom, sTo, sSubject, sMessage Set objNewMail = Nothing End If End Sub %>
Целесообразно также вовлечь в процедуру показ формы, служащей для добавления новых сообщений (обратите внимание, что форма замкнута на себе, то есть в качестве реакции на нее служит модуль, который именно ее и содержит):
<% Sub ShowForm(Sign) %> <center> <form action="guest.asp?mode=post" method="post"> <table width=400 border=0 cellpadding=3 cellspacing=0 bgcolor=<%=ObjRec2("Form_Color")%>> <tr> <td colspan=2 align=center><font face="<%=objRec2("PageFontFace")%>"color=" <%=objRec2("PageFontColor")%>" size="<%=objRec2("FormTitleSize")%>"> <b>Оставьте запись в нашей гостевой книге</b> <p><font size="<%=objRec2("PageFontSize")%>"><font color=red><sup>*</sup> </font>Обозначает поля, которые обязательно нужно запомнить</font></font> </td> </tr> <tr><td align=left bgcolor=<%=ObjRec2("Form_Color")%> colspan=2> <font face="<%=objRec2("PageFontFace")%>" color="<%=objRec2("PageFontColor")%>" size="<%=objRec2("PageFontSize")%>"> <b>Ваше имя:</b> <font color=red><sup>*</sup></font></td></tr> <tr> <td width=230><input name="name" value="<%= Request.Form("name") %>" size=30> </td> <td width=170> <% If dictFields(LCase("name")) Then Response.Write "<font size=""-2"" color=""red"" face=""verdana,arial,sans-serif""> You must enter a name</font><br>" Else Response.Write "<font size=""-2""> <br></font>" End If %> </td></tr> <tr> <td align=left bgcolor=<%=ObjRec2("Form_Color")%> colspan=2> <font face="<%=objRec2("PageFontFace")%>" color="<%=objRec2("PageFontColor")%>" size="<%=objRec2("PageFontSize")%>"> <b>Email:</b> </td> </tr> <tr> <td colspan=2><input name="email" value="<%= Request.Form("email") %>" size=30> </td> </tr> <tr> <td align=left bgcolor=<%=ObjRec2("Form_Color")%> colspan=2> <font face="<%=objRec2("PageFontFace")%>" color="<%=objRec2("PageFontColor")%>" size="<%=objRec2("PageFontSize")%>"> <b>URL:</b> </td> </tr> <tr> <td colspan=2> <font face="<%=objRec2("PageFontFace")%>" color=" <%=objRec2("PageFontColor")%> " size="<%=objRec2("PageFontSize")%>"> <a href="http:// %3c/font">http:// </font</a>> <input name="url" value="<%= Request.Form("url") %>" size=30> </td> </tr> <tr> <td align=left bgcolor=<%=ObjRec2("Form_Color")%> colspan=2> <font face="<%=objRec2("PageFontFace")%>" color="<%=objRec2("PageFontColor")%>" size="<%=objRec2("PageFontSize")%>"> <b>Страна:</b> </td> </tr> <tr> <td colspan=2><input name="country" value="<%= Request.Form("country") %>" size=30></td></tr> <tr><td align=center colspan=2><font face="<%=objRec2("PageFontFace")%>" color="<%=objRec2("PageFontColor")%>" size="<%=objRec2("PageFontSize")%>"> <b>Как Вы оцениваете наш сайт?</b><br> <select NAME="Rating" size="1"><option value="0" <% If Request.Form("Rating") = "0" then Response.Write "selected" End if %> >Без оценки</option> <option value="1" <% If Request.Form("Rating") = "1" then Response.Write "selected" End if %> >1 Балл</option> <option value="2" <% If Request.Form("Rating") = "2" then Response.Write "selected" End if %> >2 Балла</option> <option value="3" <% If Request.Form("Rating") = "3" then Response.Write "selected" End if %> >3 Балла</option><option value="4" <% If Request.Form("Rating") = "4" then Response.Write "selected" End if %> >4 Балла</option><option value="5" <% If Request.Form("Rating") = "5" then Response.Write "selected" End if %> >5 Баллов</option></select></td></tr> <tr><td align=center colspan=2><font face="<%=objRec2("PageFontFace")%>" color="<%=objRec2("PageFontColor")%>" size="<%=objRec2("PageFontSize")%> "><b>Ваши комментарии:<font color=red><sup>*</sup></font></b></td></tr> <tr><td align=center colspan=2><textarea name="Message" rows=6 cols=40 wrap="virtual"><%= Request.Form("Message") %></textarea></td></tr> <tr><td align=center colspan=2><font face="<%=objRec2("PageFontFace")%>" color="red" size="-2"> <% If dictFields(LCase("message")) Then Response.Write "Вы не ввели сообщение</font><br>" Else Response.Write " <br></font>" End If %> <INPUT type="submit" value="Оставить запись" name=submit></td></tr></table></form> <% End Sub %>
Затем следует основная функция, служащая для показа фиксированного количества сообщений пользователей (значения извлекаемого из таблицы административных настроек):
<% Sub Show NumPerPage=INT(objRec2("NumPerPage")) If Request.QueryString("page") = "" Then iPageCurrent = 1 Else iPageCurrent = CInt(Request.QueryString("page")) End If Set objRec = Server.CreateObject ("ADODB.Recordset") StrSql = "SELECT * FROM Messages ORDER BY ID DESC;" objRec.PageSize = NumPerPage objRec.CacheSize = NumPerPage objRec.Open StrSql,objConn,3,1,&H0001 iPages = objRec.PageCount TotalRows = objRec.RecordCount If iPageCurrent > iPages Then iPageCurrent = iPages If iPageCurrent < 1 Then iPageCurrent = 1 If iPages = 0 Then Response.Write "Не найденно записей!" Else ObjRec.AbsolutePage = iPageCurrent %> <p align=left><font face="<%=objRec2("PageFontFace")%> " color="<%=objRec2("PageFontColor")%>" size="<%=objRec2("PageFontSize")%>"> Всего в книге <b><%=TotalRows%></b> записей на <b><%=iPages%></b> странице(ах)</font></p> <% iRecordsShown = 0 Do While iRecordsShown < NumPerPage And Not objRec.EOF Rating = ObjRec("Rating") If IsNull(Rating) or Rating="0" then Rating = "nr" Else Rating = ObjRec("Rating") End If If IsNull(ObjRec("URL")) then Link = "Не указан URL" Else Link = "<a href='http://" & ObjRec("URL") & "'>http://" & ObjRec("URL") & "</a>" End If Email = FormatStr(ObjRec("Email")) Name = FormatStr(ObjRec("Name")) %> <table width="550" border="0" cellpadding="1" cellspacing="0"> <tr> <td colspan="2" bgcolor="<%=ObjRec2("Top_Color")%>"> <font face="<%=objRec2("InfoFontFace")%>" color="<%=objRec2("InfoFontColor")%>" size="<%=objRec2("InfoFontSize")%>"><%=ObjRec("DateID") %> </font> </td> <td align="right" bgcolor="<%=ObjRec2("Top_Color")%>"> <font face="<%=objRec2("InfoFontFace")%>" color="<%=objRec2("InfoFontColor")%>" size="<%=objRec2("InfoFontSize")%>"><b>Оценка сайта: </b> </font> <img src="images/star<%= Rating %>.gif" height="14" width="65"> </td> </tr> <tr><td colspan=3 bgcolor="<%=ObjRec2("Mid_Color")%>"> <font face="<%=objRec2("MessageFontFace")%>" color="<%=objRec2("MessageFontColor")%>" size="<%=objRec2("MessageFontSize")%>"><%=FormatStr(ObjRec("Message"))%> </font> </td> </tr> <tr> <td width="110" valign="top" bgcolor="<%=ObjRec2("Bot_Color")%>"> <font face="<%=objRec2("InfoFontFace")%>" color="<%=objRec2("InfoFontColor")%>" size="<%=objRec2("InfoFontSize")%>"> <% If IsEmpty(Email) or Email=" " then Response.Write Name Else Response.Write "<a href=""mailto:" & Email & """><img src=images/mail.gif border=0></a> " & Name End If %> </font> </td> <td width="180" valign="top" bgcolor="<%=ObjRec2("Bot_Color")%>"> <font face="<%=objRec2("InfoFontFace")%>" color="<%=objRec2("InfoFontColor")%>" size="<%=objRec2("InfoFontSize")%>"><%=FormatStr(ObjRec("Country")) %> <i> IP:<%= ObjRec("IP") %> </i> </font> </td> <td width=260 align="right" valign="top" bgcolor="<%=ObjRec2("Bot_Color")%>"> <font face="<%=objRec2("InfoFontFace")%>" color="<%=objRec2("InfoFontColor")%>" size="<%=objRec2("InfoFontSize")%>"> <%=Link%> </font> </td> </tr> </table> <br> <% iRecordsShown = iRecordsShown + 1 objRec.MoveNext Loop if iPages > 1 then %> <p align=left> <font face="<%=objRec2("PageFontFace")%>" color="<%=objRec2("PageFontColor")%>" size="<%=objRec2("PageFontSize")%>"> <b>Pages: </b> <% For I = 1 To iPages If I = iPageCurrent Then Response.Write "<b>" & I & "</b> " Else Response.Write "<a href=./guest.asp?page=" & I & ">" & I & "</a> " End If Next Response.Write "</font>" Else Response.Write " " End If End If objRec.Close Set objRec = Nothing End Sub %>
Обратите внимание на то, каким образом формируется и осуществляется ссылка на просмотр следующей странички с такой «порцией» сообщений:
Response.Write "<a href=./guest.asp?page=" & I & ">" & I & "</a> "
Как видите, в качестве значения параметра page ей передается номер странички и впоследствии, если это значение не равно 1, показ сообщений начинается не с первого сообщения, а с того, которое окажется первым по счету на страничке с соответствующим номером, заданным в параметре:
<% NumPerPage=INT(objRec2("NumPerPage")) If Request.QueryString("page") = "" Then iPageCurrent = 1 Else iPageCurrent = CInt(Request.QueryString("page")) End If %> Далее следует исходный текст самого модуля, в котором осуществляются подключение к базе данных и извлечение записей (в описываемом примере это будет единственной записью) из таблицы административных настроек Admin:
<% Set objConn = Server.CreateObject ("ADODB.Connection") objConn.Open StrConn Set objRec2 = Server.CreateObject ("ADODB.Recordset") ConfigSql = "SELECT * FROM Admin;" objRec2.Open ConfigSql,objConn,0,1,&H0001 %>
Затем можно оформить заголовок и основные тэги HTML-странички:
<head> <title>ASP на блюдечке часть 15 - Гостевая книга своими руками</title> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> </head> <body marginwidth="0" marginheight="0" leftmargin="0" topmargin="0"> <table width="780" border="0" cellspacing="0" cellpadding="0"> <tr> <td align="left" valign="top" height="389"> <center> <table border="0" width="550" cellpadding="0"> <tr> <td width=100% valign=bottom align=middle> <font face="<%=objRec2("PageFontFace")%>" color="<%=objRec2("PageFontColor")%>" size="<%=objRec2("PageFontSize")%>">
Теперь нужно сформировать ссылки на ваш функционал (просмотр и добавление записей в гостевую книгу):
<a href="guest.asp?mode=show">Просмотреть гостевую книгу</a> | <a href="guest.asp?mode=post">Оставить запись в гостевой книге</a> </font> <p> </td> </tr> <tr> <td align=center>
И наконец, главный цикл обработки вашей главной и единственной asp-странички модуля будет выглядеть следующим образом:
<% select case Request.QueryString("mode") case "post" Dim Field Dim dictFields Set dictFields = Server.CreateObject("Scripting.Dictionary") For Each Field in Request.Form If ValidateField(Request.Form(Field), Field) = False Then dictFields.Add LCase(Field), True End If Next If Request.Form.Count <> 0 And dictFields.Count = 0 Then Call Update Else If Request.Form.Count <> 0 Then End If ShowForm("Sign") End If case "show" Call Show case Else Call Show End Select %>
Здесь рассматриваются всего два случая (case), соответствующие двум функциям нашего Web-приложения: добавлениe новой записи в гостевую книгу (значение параметра mode = “post”) и просмотр сообщений гостевой книги (значение параметра mode = “show”).
<% objRec2.Close Set objRec2 = Nothing s objConn.Close Set objConn = Nothing Response.Write "</td></tr></table></center>" %> </td> </tr> </table> </body> </html>
Мы рассмотрели еще один функциональный компонент сайта, причем сразу сделали его переносимым. Результатом этого явился довольно сложный с точки зрения восприятия исходный код. Хотя большое число параметров, извлекаемых из административной таблицы, несколько усложнило восприятие исходного кода модуля, однако их применение раз и навсегда избавит вас от необходимости править код при их изменении. Разработанная нами система вполне приемлема в использовании, а благодаря модульности ее реализации и описанному в статье подходу к ее внедрению в уже существующие сайты она может быть применена в качестве гостевой книги на сайте практически любой степени сложности.
Следовало бы, конечно, рассмотреть и Web-интерфейс для редактирования, добавления и удаления административных настроек (схем), однако это займет много времени, и поэтому автор постарается освeтить его в одной из следующих частей настоящей статьи.
КомпьютерПресс 11'2001